這系列無障礙的鐵人賽文章,實踐的內容主要是根據 W3C:WAI-ARIA 的實踐,從設計模式及組件(Design Patterns and Widgets)裡面挑選最想嘗試的,如果有朋友想瞭解全部 Widget 該怎麼實作及其規範,歡迎自行爬規範內容,也許我們可以討論一下;若以下文章內容理解有任何錯誤,請多指教~
(圖片來源:deque)
3.11 feed _ WAI-ARIA 1.1
A feed enables users of assistive technologies that have a document browse mode, such as screen readers, to use the browse mode reading cursor to both read and scroll through a stream of rich content that may continue scrolling infinitely by loading more content as the user reads.
feed
是 WAI-ARIA 1.1 的中的新角色,也列為 WAI-ARIA Practice 1.1 的設計模式之一, feed
主要為了要讓輔助裝置能瞭解我們現今很多的網頁當中常應用的功能——「無限捲軸」。
網頁中有非常多的文章或訊息時,通常我們會做成一個「列表」來呈現,這時就會有換頁的需求,我們就會實踐一個功能叫做「Pagination」,讓使用者可以點選位於列表下方的「頁數」或「上一頁、下一頁」來進行換頁。而為了讓使用者更方便,可以不用透過點擊的方式來載入下一頁的內容,就有聰明的團隊想到要使用「捲動(Scroll)」的方式,讓使用者瀏覽文章時,只要「捲動」捲軸的接近底部時,直接在頁面最下方載入原本要按下一頁才能更新的文章項目。
這個看似方便大眾的功能,在可訪問性上,是具有爭議的,原因在於無限捲軸的作法確實提供了大多數使用者便利(啊~只要捲捲捲或是滑滑滑就能看到新內容多好啊),能夠不斷餵食使用者新內容,這在某種程度上能大幅增加使用者滯留於應用程式的時間。
不過大多數的團隊忽略了兩件事情:
tab
鍵切換焦點時,從中聽出來什麼時候會到盡頭...因為當使用者 focus 到第五篇文章時,又會載入新文章,真的是獲取資訊的無限地獄,這也對應到下個議題「訪問目的」。這也容易忽略頁腳,像我也曾經看到網站將聯絡資訊設計在頁腳 <footer>
,我需要的聯絡資訊以便聯絡該公司,所以使用 Chrome 瀏覽器捲到下方,可是永遠都看不到盡頭(=_=)。這裡並不是指創新的做法不好,而是我們若能透過思考無限捲軸的使用目的與情境,更能去當一個以使用者為出發點的工程師,而不是功能 Spec 開什麼就做什麼,那麼接下來就進入正題囉。
feed
這個 WAI-ARIA 1.1 新增的角色讓輔助裝置啟用文件瀏覽模式(document browse mode),在載入新內容時,會通知輔助裝置,進而實現無限捲軸的元件,而feed
角色是繼承自 list
角色,它的本質是頁面的結構,也就是說 feed
本來就是一系列的文章或訊息構成,只是載入內容模式是創新的捲動方式而非點擊的做法。
我們產出的程式碼與輔助科技之間需要互相配合,各司其職,遵守以下的互動原則來實現可靠的瀏覽模式:
<article>
或是子元素是可以被聚焦的。feed
,可能想瀏覽 feed
之前或之後的內容。因為 feed 角色和鍵盤的互動性並無協議約定,所以其實並無限制,而以下是建議做法:
當焦點在 feed
時
Page Down
:將焦點移到下一篇文章。Page Up
:將焦點移到上一篇文章。Control + End
:將焦點移到 feed
後的第一個可聚焦元素。Control + Home
:將焦點移到 feed
前的第一個可聚焦元素。重要註記:
feed
,比如說在社群媒體的每一則 article feed
之下,都還有包含著 comment feed
,如果你需要使用者能切換焦點到 comment feed
之中,讓使用者能用 tab
鍵將焦點移動到巢狀feed 中,不過若 <article>
子元素包含大量的連結、按鈕或其他小部件,這可能會很慢。在巢狀的 feed
中,焦點策略是極具挑戰的。role
,值為 feed
。feed
無限捲軸的容器
aria-label
為它補充名稱,如果名稱已經呈現在頁面上,使用 aria-labelledby
關聯該元素的 id
。feed
的子代元素需要指定角色為 article
(role="article"
),除非使用的是具有語義的 <article>
標籤。feed
在載入新內容或移除內容時,在 feed
上設定 aria-busy="true"
,若是載入或移除動作完成,就將 aria-busy
的值設為 false
或整個移除掉。article
每篇文章或是訊息項目
article
,透過 aria-describedby
去關聯 article
中最具有描述意義的內容的元素 id
。aria-posinset
,值是數字,標註該則文章是在整個文章串或討論串的第幾則。aria-setsize
,值是數字,標註 feed
的總數,讓使用者在 focus 任一文章時,永遠知道實際數量,如果情境是無法得知 feed
總數的時候,將 aria-setsize
的值設為 -1
。今天引用 WAI-ARIA Practice 1.1 的範例 Feed Example!
抱歉今天沒有 codepen,請看範例:Feed Example ,並且打開開發者工具來看一下是否都符合唷。
如果以後自己要實作的話,這篇文章是你可以參考的內容,但謹記一定要找實體的輔助科技裝置來測試。